<?php
namespace Admin\Model;
use Zend\Db\TableGateway\TableGateway;
use Zend\Debug\Debug;
use Zend\Db\Adapter\Adapter;
use Zend\Db\Sql\Select;
use Zend\Db\Sql\Sql;
class AdminProductTable{
	protected $tableGateway;

	public function __construct(TableGateway $table){
		$this->tableGateway = $table;
	}

	public function fetchAll(){
		$result = $this->tableGateway->select();
		return $result;
	}

	// lấy thông tin một sản phẩm
	public function getProduct($id){
		$id = (int)$id;
		$rowset = $this->tableGateway->select(array('id'=>$id));
		$row = $rowset->current();
		if(!$row){
			throw new \Exception('Có lỗi, không tìm thấy dữ liệu được yêu cầu');
		}
		return $row;
	}

	// Thêm một sản phẩm
	public function saveProduct($arrParam = array(), $options = array()){
		if(isset($arrParam['submit']))
			unset($arrParam['submit']);
		if(!$this->checkingNewProduct($arrParam['maHang'])){
			echo "Trùng mã hàng, hãy kiểm tra lại";
			return false;
		}

		if(!isset($arrParam['soLuongNhapVao']))
			$arrParam['soLuongNhapVao'] = $arrParam['soLuong'];
		$result = false;
		try{
		if($options['task'] == 'add')
			$result = $this->tableGateway->insert($arrParam);
		}catch(Exception $e){
			echo $e;
		}
		return $result;
	}

	// Thay đổi: xóa hoặc sửa
	public function changeProduct($arrParam = array(), $options = array()){
		$result = false;
		if($options['task'] == 'delete'){
			$id = (int)$arrParam['id'];
			$data = $this->getProduct($id);
			$maHang = $data->maHang;
			$loaiHang = $data->loaiHang;
			$files = $data->hinhAnh;
			$arrFiles = explode('|', $files);
			unset($arrFiles[count($arrFiles)]);

			$this->deletePath($loaiHang,$maHang,$arrFiles);
			$this->deleteTree($loaiHang.'/'.$maHang);
			$result = $this->tableGateway->delete(array('id'=>$id));
			return $result;
		}
	}

	public function editProduct($arrParam = array(),$oldInform = array(),$options = array()){
		if($options['task'] == 'edit'){
			$result = false;
			$id = $oldInform['id'];
			if($arrParam['hinhAnh'] == '')
				$arrParam['hinhAnh'] = $oldInform['hinhAnh'];
			$result = $this->tableGateway->update($arrParam,array('id'=> $id));
			return $result;
		}

		return false;
	}

	// xóa thư mục và nội dung bên trong
	public function deletePath($loaiHang,$maHang = '', $arrFiles = array()){
		// đầu vào: loại sản phẩm, tên thư mục ( mã hàng ) cần xóa và danh sách các file
		$result = false;
		$maHang = FILES_PATH.'/'.$loaiHang.'/'.$maHang;
		if(!is_dir($maHang))
			return;
		echo '<br/>'.$maHang;
		for($i = 0; $i < count($arrFiles); $i++){
			unlink($maHang.'/'.$arrFiles);
		}
		$maHang = FILES_PATH.'/'.$loaiHang.'/'.$maHang;
		rmdir($maHang);

		return $result;
	}

	// xóa cây thư mục
	public static function deleteTree($dirName){
		$dir = FILES_PATH."/$dirName";
		if(!is_dir($dir))
			return;
		echo '<br/>'.$dir;
		$files = array_diff(scandir($dir), array('.','..'));
		foreach ($files as $file) {
			(is_dir("$dir/$file")) ? deleteTree("dir/$file") : unlink("$dir/$file");
		}

		return rmdir($dir);
	}

	// kiểm tra khi thêm một sản phẩm, nếu trùng mã hàng thì trả về false.
	public function checkingNewProduct($maHang){
		$rowset = $this->tableGateway->select(array('maHang'=>$maHang));
		$row = $rowset->current();
		return empty($row) ? true : false;
	}
	// lấy thông tin tạm của sản phẩm
	public function getSimpleInform(){
		$adapter = $this->getAdapter();
		$sql = new Sql($adapter);
		$select = $sql->select('sanpham');
		$select->columns(array('maHang','gia','hinhAnh','loaiHang','soLuong'));
		$predicate = new \Zend\Db\Sql\Where();
		$select->where($predicate->greaterThan('soLuong','0'));
		$select->order('maHang ASC');
		$selectString = $sql->getSqlStringForSqlObject($select);
		$results = $adapter->query($selectString,$adapter::QUERY_MODE_EXECUTE);
		$result = $results->toArray();
		return $result;
	}

	// cập nhật số lượng hàng đã bán
	public function soldCounters($maHang,$sl){
		$adapter = $this->getAdapter();
		$sql = new Sql($adapter);
		$select = $sql->select('sanpham');
		$select->where(array('maHang' => $maHang));
		$selectString = $sql->getSqlStringForSqlObject($select);
		$data = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
		$arrParam = $data->toArray()[0];
		$arrParam['soLuong'] = $arrParam['soLuong'] - $sl;
		$id = $arrParam['id'];
		$result = $this->tableGateway->update($arrParam,array('id'=>$id));
	}


	// lấy adapter
	public function getAdapter(){
		$adapter = new Adapter(array(
		    'driver' => 'Pdo_Mysql',
		    'database' => 'giayvinhxinh',
		    'username' => 'root',
		    'password' => '',
		    'driver_options'=>  array(
				1002=>'SET NAMES utf8'
			),
		 ));
		return $adapter;
	}
}